package services.cliente;

import java.util.ArrayList;
import java.util.List;

import org.springframework.transaction.annotation.Transactional;

import util.assembly.ClienteAssembly;

import bo.Cliente;
import bo.PersistentObject;
import dao.ClienteDAO;
import dto.ClienteDTO;
import dto.SearchDTO;
import exceptions.CannotDeleteException;
import exceptions.CannotSaveException;

public class ClienteService {

	ClienteDAO clienteDAO;
	
	/**
	 * Guarda un cliente
	 * @param clienteDTO	DTO de cliente
	 */
	@Transactional
	public String save(ClienteDTO clienteDTO) throws CannotSaveException {
		
		Cliente cliente = ClienteAssembly.toBO(clienteDTO);
		
		String id = clienteDAO.save(cliente);
		if (id == null) {
			throw new CannotSaveException();
		}
		return id;
	}

	
	/**
	 * Borra un cliente
	 * @param id	ID del cliente a borrar
	 * @throws CannotDeleteException
	 */
	@Transactional
	public void delete(String id) throws CannotDeleteException {
		
		Cliente cliente = (Cliente) clienteDAO.findById(Cliente.class, id);
		
		clienteDAO.delete(cliente);
	}
	
	
	@Transactional
	public List<ClienteDTO> search(SearchDTO searchDTO) {
		
		List<ClienteDTO> lista = new ArrayList<ClienteDTO>();
		
		List<PersistentObject> clientes = clienteDAO.search(Cliente.class, searchDTO);
		for (PersistentObject persistentObject : clientes) {
			lista.add(ClienteAssembly.toDTO((Cliente)persistentObject));
		}
		return lista;
	}
	
	
	
	/**
	 * Obtiene todos los producots
	 * @return	la lista de clientes
	 */
	@Transactional
	public List<ClienteDTO> findAll() {
		
		List<ClienteDTO> lista = new ArrayList<ClienteDTO>();
		
		List<PersistentObject> clientes = clienteDAO.findAll(Cliente.class);
		for (PersistentObject persistentObject : clientes) {
			lista.add(ClienteAssembly.toDTO((Cliente)persistentObject));
		}
		return lista;
	}
	
	/**
	 * Obtiene un cliente segun ID
	 * @param id	el ID
	 * @return el cliente
	 */
	@Transactional
	public ClienteDTO findById(String id) {
		
		Cliente cliente = (Cliente) clienteDAO.findById(Cliente.class, id);
		ClienteDTO clienteDTO = ClienteAssembly.toDTO(cliente);
		return clienteDTO;
	}
	

	public ClienteDAO getClienteDAO() {
		return clienteDAO;
	}

	public void setClienteDAO(ClienteDAO clienteDAO) {
		this.clienteDAO = clienteDAO;
	}
	
}
